//
//  ConstantsAndVariables.swift
//  Swift_base_grammar
//
//  Created by lantaiyuan on 2017/9/13.
//  Copyright © 2017年 lantaiyuan. All rights reserved.
//  常量和变量

import Foundation
import UIKit
/**
 0. Swift中，不需要分号，在其他语言中，`;`的作用是表示一句指令结束
 如果多个语句并列，可以使用分号
 1. OC 中，alloc / init 对应在 ()，构造函数，创建并且初始化对象
 2. OC 中，alloc / initWithXXX，Swift 中 (XXX: )
 3. OC 中，[UIColor redColor] 类函数，在 Swift 中直接用 .
 4. 枚举类型 UIButtonTypeContactAdd，Swift中分开写，[回车－> 向右－> .]
 直接 . 很多时候，没有智能提示！
 5. print 类似于 OC 的 NSLog，但是效率更高
 6. 添加监听方法，直接用 "方法名"，如果有参数 "方法名:"
 
 7. Swift 中，可以省略 self.，加上也可以，个人建议，最好不要加，`闭包`中必须要 self.
 */
//定义常量和变量
func demo() {
    // let 定义常量 - 一旦设置数值，不允许修改
    // var 定义变量 - 可以修改
    // 问题：let & var 如何选择，尽量用 let，必须要修改的时候，再用 var，程序更安全
    let x = 10
    var y = 20
    y = 15
    print(x + y)
    
    // 视图实例化之后，并没有修改指针地址
    let v = UIView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
    // 只是在修改属性
    v.backgroundColor = UIColor.red
}


/// 类型转化
func demo1() {
    // 自动推导 - 会根据设置数值的右侧代码，推断变量/常量的类型
    // 但是：在 Swift 中，任何时候，都不会做隐式转换
    // 任何两个类型不同的变量或者常量不允许直接计算！- Swift 是一个类型要求异常严格的语言！
    // 整数默认是 Int -> 64位整数 long
    let x = 20
    // 小数默认是 Double -> 双精度的小数，OC 中使用 CGFloat 比较多，浮点数
    let y = 1.5
    let r = x + Int(y)
    
    let r2 = Double(x) + y
    print(r,r2)

}

/// 可选项：一个变量，可以为本身的类型，也可以为 nil
func demo2() {
    // 定义变量／常量如果需要指定类型 : 类型 的方式指定准确的类型
    let x: Double = 20

    // 可选项 使用 ? 定义
    // y 可以是一个整数/也可以是 nil，如果是变量，默认是 nil
    // 注意：可选项在输出的时候，会提示 `Optional`
    
    var y:Int?
    
    // * 可选项不能直接计算
    // ! － `强行解包 unwrapping` - 程序员承诺 y 一定有值，如果没有，崩给我看！
    // unexpectedly found nil while unwrapping an Optional value
    // 每次写 ! 的时候，都需要程序员思考，是不是有可能为 nil!
    print(y as Any)//有可能为nil
    y = 10
    print(y!)//强制解包,必须要有值
    print(x + 1.5,y! + 20)
}

/**
 - 1. 明确可选项的概念！
 - 2. 实际开发中，借助 Xcode 智能提示，帮助修改！
 - 3. 每次修改，都要思考为什么！
 */
func demo3() {
    let urlStr = "http://www.baidu.com/"
    //构造函数有? 表示不一定能创建出对象
    let url = NSURL.init(string: urlStr)
    
    print(url as Any)//可能为任意值nil
    print(url!)//必须有值
    // 注意：如果参数中，没有 ? 表示必须要有值，如果为 nil，就崩！
    if url != nil {
        let request = NSURLRequest.init(url: url! as URL)
        print(request)
    }
}
